perf(activitylistmodel): store conflicts in separate list
authorJyrki Gadinger <nilsding@nilsding.org>
Fri, 25 Jul 2025 10:03:36 +0000 (12:03 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Fri, 25 Jul 2025 11:02:36 +0000 (11:02 +0000)
Figuring out whether a sync conflict occurred by iterating through the
entire activity list each time a new activity was added is really slow,
even more so when there already are thousands of previous activities.
This was especially noticeable during complete initial full syncs
involving more than ~5000 files.

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
src/gui/tray/activitylistmodel.cpp
src/gui/tray/activitylistmodel.h

index 554559b16185eab83b3182c6c380e01dee575033..a5e7be3de78c4129100cb4de16c647700459e14e 100644 (file)
@@ -540,15 +540,13 @@ void ActivityListModel::addEntriesToActivityList(const ActivityList &activityLis
     beginInsertRows({}, startRow, startRow + activityList.count() - 1);
     for(const auto &activity : activityList) {
         _finalList.append(activity);
+        if (activity._syncFileItemStatus == SyncFileItem::Conflict) {
+            _conflictsList.push_back(activity);
+        }
     }
     endInsertRows();
 
-    const auto deselectedConflictIt = std::find_if(_finalList.constBegin(), _finalList.constEnd(), [] (const auto &activity) {
-        return activity._syncFileItemStatus == SyncFileItem::Conflict;
-    });
-    const auto conflictsFound = (deselectedConflictIt != _finalList.constEnd());
-
-    setHasSyncConflicts(conflictsFound);
+    setHasSyncConflicts(!_conflictsList.isEmpty());
 }
 
 void ActivityListModel::accountStateHasChanged()
@@ -633,6 +631,10 @@ void ActivityListModel::removeActivityFromActivityList(const Activity &activity)
         endRemoveRows();
     }
 
+    if (activity._syncFileItemStatus == SyncFileItem::Conflict) {
+        _conflictsList.removeOne(activity);
+    }
+
     if (activity._type != Activity::ActivityType &&
         activity._type != Activity::DummyFetchingActivityType &&
         activity._type != Activity::DummyMoreActivitiesAvailableType &&
@@ -933,6 +935,7 @@ void ActivityListModel::slotRefreshActivityInitial()
 void ActivityListModel::slotRemoveAccount()
 {
     _finalList.clear();
+    _conflictsList.clear();
     _activityLists.clear();
     _presentedActivities.clear();
     setAndRefreshCurrentlyFetching(false);
@@ -965,15 +968,7 @@ bool ActivityListModel::hasSyncConflicts() const
 
 ActivityList ActivityListModel::allConflicts() const
 {
-    auto result = ActivityList{};
-
-    for(const auto &activity : _finalList) {
-        if (activity._syncFileItemStatus == SyncFileItem::Conflict) {
-            result.push_back(activity);
-        }
-    }
-
-    return result;
+    return _conflictsList;
 }
 
 }
index 0ac9af94dab20c575f833bb9b796ab527d48e63f..b69ed81b78b0259f1f543671a55c409f7433e450 100644 (file)
@@ -191,6 +191,7 @@ private:
     ActivityList _notificationLists;
     ActivityList _listOfIgnoredFiles;
     ActivityList _notificationErrorsLists;
+    ActivityList _conflictsList;
     ActivityList _finalList;
 
     QSet<qint64> _presentedActivities;